import 'dart:convert';
import 'dart:typed_data';
import 'package:encrypt/encrypt.dart';

/// AES加密解密工具类
/// 使用AES-256-CBC模式进行图片数据的加密解密
class AesCryptoUtil {
  // 固定密钥：12345678901234567890123456789012 (32字节)
  static const String _secretKey = '12345678901234567890123456789012';

  // 固定IV向量 (16字节零向量)
  static final _iv = IV(Uint8List(16));

  static final _key = Key.fromBase64(base64Encode(utf8.encode(_secretKey)));
  static final _encrypter = Encrypter(AES(_key, mode: AESMode.cbc));

  /// 解密图片字节数据
  /// [encryptedBytes] 加密的字节数据
  /// 返回解密后的字节数据，如果解密失败则返回原始数据
  static Uint8List decryptImageBytes(Uint8List encryptedBytes) {
    try {
      // 将字节数据转换为加密对象
      final encrypted = Encrypted(encryptedBytes);

      // 执行解密
      final decryptedBytes = _encrypter.decryptBytes(encrypted, iv: _iv);

      return Uint8List.fromList(decryptedBytes);
    } catch (e) {
      // 解密失败时返回原始数据，避免图片加载失败
      print('图片解密失败，返回原始数据: $e');

      return encryptedBytes;
    }
  }

  /// 加密图片字节数据（用于测试）
  /// [imageBytes] 原始图片字节数据
  /// 返回加密后的字节数据
  static Uint8List encryptImageBytes(Uint8List imageBytes) {
    try {
      final encrypted = _encrypter.encryptBytes(imageBytes, iv: _iv);
      return encrypted.bytes;
    } catch (e) {
      print('图片加密失败: $e');
      return imageBytes;
    }
  }

  /// 检查数据是否可能是加密数据
  /// 通过尝试解密前几个字节来判断
  static bool isEncryptedData(Uint8List bytes) {
    if (bytes.length < 16) return false;

    try {
      // 尝试解密前16个字节
      final testBytes = bytes.sublist(0, 16);
      final encrypted = Encrypted(testBytes);
      _encrypter.decryptBytes(encrypted, iv: _iv);
      return true;
    } catch (e) {
      return false;
    }
  }
}
